package jml.defaultimple.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import jml.config.Config;
import jml.config.Plugin;
import jml.config.Plugins;
import jml.def.Title;
import jml.defaultimple.LabelImple;

public class JMLPluginManager
{
	public static ArrayList<jml.def.Plugin> plugins = null;

	public static ArrayList<jml.def.Plugin> getPlugins()
	{
		if(plugins == null)
		{
			plugins = new ArrayList<jml.def.Plugin>();
			_loadPlugins();
		}

		return plugins;
	}

	private static void _loadPlugins()
	{
		try
		{
			Plugins pgs = Config.getConfig(false).getPlugins();

			for(Plugin p : pgs.getPlugins())
			{
				jml.def.Plugin plgInstancia = (jml.def.Plugin) Class.forName(p.getType()).newInstance();
				plgInstancia.setName(p.getName());

				LabelImple lbl = new LabelImple();
				lbl.setName(p.getName());
				plgInstancia.setPluginLabel(lbl);

				plgInstancia.setParameters(p.getParameters());

				plugins.add(plgInstancia);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	public static void notifyAll(String mtdName, Object... t)
	{
		for(jml.def.Plugin p : getPlugins())
		{
			if(t != null)
			{
				_notificarPlugin(p, mtdName, t);
			}
		}
	}

	private static void _notificarPlugin(jml.def.Plugin p, String mtdName, Object... t)
	{
		try
		{
			// obtengo el metodo
			Method mtd = _obtenerMetodo(p,mtdName);

			// lo invoco
			
			
			mtd.invoke(p, t);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	private static Method _obtenerMetodo(Object target,String mtdName)
	{	
		Method mtds[] = target.getClass().getDeclaredMethods();
		for(Method mtd:mtds)
		{
			if( mtd.getName().equals(mtdName) )
			{
				return mtd;
			}
		}
		
		return null;
	}
	
	// public static void notifyAll(String mtdName,Object t)
	// {
	// try
	// {
	// for(jml.def.Plugin p: getPlugins())
	// {
	// if(t==null )
	// {
	// continue;
	// }
	//
	// Class<?>[] tInterfaces = t.getClass().getInterfaces();
	// Class<?> tInterface = tInterfaces[0];
	//
	// Class<?>[] args = { tInterface } ;
	//
	// Method mtd = p.getClass().getDeclaredMethod(mtdName, args);
	//
	//
	// mtd.invoke(p, t);
	// }
	// }
	// catch(Exception e)
	// {
	// e.printStackTrace();
	// throw new RuntimeException(e);
	// }
	// }

	public static jml.def.Plugin getPlugin(String name)
	{
		for(jml.def.Plugin p : getPlugins())
		{
			if(p.getName().equals(name))
			{
				return p;
			}
		}

		return null;
	}
	
	public static void main(String[] args)
	{
		JMLLoader.load("My Music/jmlconfig/jmusiclibrary.cfg.xml");
		List<jml.def.Plugin> lst = JMLPluginManager.getPlugins();

		for(jml.def.Plugin p : lst)
		{
			System.out.println(p);
		}
	}

}
